<?php

namespace App\Service;


use App\Service\Photo\Qiniu;
use Illuminate\Support\Env;

class QRcode
{
    protected $error;

    // 获取错误信息
    public function getError()
    {
        return $this->error;
    }

    // 生成二维码：七牛云
    public function getQR($uid, $type = 'user')
    {
        if($type == 'user'){
            $text = 'https://www.shenlanhui.com/space/'.$uid.'.html';  //二维码内容
        } elseif($type == 'news'){
            $text = 'https://www.shenlanhui.com/news/'.$uid.'.html';  //二维码内容
        }elseif($type == 'dispatch'){
            $text = 'https://www.shenlanhui.com/live/'.$uid.'.html';  //二维码内容
        }
        //$text = 'https://shenlanhui.com/download.html';  //二维码内容

        // 各种参数
        $size   = 6;  //生成图片大小
        $domain = 'http://slh.shenlannews.com';
        $domain = Env::get('STYLE_HOST');
        $domain = Env::get('CDN_HOST');
        $domain = substr($domain, -1) == '/' ? $domain : $domain.'/';
        //$domain = substr($domain, -1) == '/' ? substr($domain, 0, -1) : $domain;

        $path      = public_path();  // 根目录路径
        $logo      = '/static/logo.png';    //准备好的logo图片
        $logo      = '';    //准备好的logo图片    暂时不生成logo，所以卫为空
        $idPath    = $this->getIdPath($uid);
        $QRFile    = 'qrcode/'.$type.'/'.$idPath.'.png';  // 已经生成的原始二维码图
        $logoQR    = 'qrcode/'.$type.'/'.$idPath.'_logo.png';  // 生成的二维码图片位置
        $QRLocal   = '/qrcode/'.$type.'.png';  // 已经生成的原始二维码图
        $logoLocal = '/qrcode/'.$type.'_logo.png';  // 生成的二维码图片位置

        /*if(is_file($logo)){
            echo realpath($logo);
        }*/
        // 判断七牛云上面二维码图片是否已经存在
        $Qiniu = new Qiniu();
        if(empty($logo) && $Qiniu->isExistImage($QRFile)){
            return $domain.$QRFile;
        }
        if(is_file($path.$logo) && $Qiniu->isExistImage($logoQR)){
            return $domain.$logoQR;
        }
        if(is_file($path.$QRLocal)){
            unlink($path.$QRLocal);   // 删除图片 方便在生成
        }
        if(is_file($path.$logoLocal)){
            unlink($path.$logoLocal);   // 删除图片 方便在生成
        }

        //生成二维码图片
        $this->makeQR($text, $path.$QRLocal, $size);
        $res = $Qiniu->upQiniu($path.$QRLocal, $QRFile);
        if((!is_file($path.$logo)) && (is_file($path.$QRLocal))){
            unlink($path.$QRLocal);   // 删除图片 方便下次在生成
        }
        if($res === false){
            return $this->return_false($Qiniu->getError());
        }
        if(empty($logo) || (!is_file($path.$logo))){
            return $domain.$QRFile;
        }

        // 生成带logo的二维码
        if(is_file($path.$QRLocal) && is_file($path.$logo)){
            $this->makeLogoQR($path.$QRLocal, $path.$logo, $path.$logoLocal);
            $res = $Qiniu->upQiniu($path.$logoLocal, $logoQR);
            if(is_file($path.$logoLocal)){
                unlink($path.$logoLocal);   // 删除图片 方便下次在生成
            }
            if(is_file($path.$QRLocal)){
                unlink($path.$QRLocal);   // 删除图片 方便下次在生成
            }
            if($res === false){
                return $this->return_false($Qiniu->getError());
            }
        }

        return $domain.$logoQR;
    }


    // 生成二维码：本地
    public function getQRLocal($uid, $type = 'user')
    {
        if($type == 'user'){
            $text = 'https://www.shenlanhui.com/space/'.$uid.'.html';  //二维码内容
        } elseif($type == 'news'){
            $text = 'https://www.shenlanhui.com/news/'.$uid.'.html';  //二维码内容
        }
        $text = 'https://shenlanhui.com/download.html';  //二维码内容

        // 各种参数
        $size   = 6;  //生成图片大小
        $domain = 'http://slh.shenlannews.com';
        $domain = Env::get('STYLE_HOST');
        $domain = substr($domain, -1) == '/' ? substr($domain, 0, -1) : $domain;

        $path   = public_path();  // 根目录路径
        $logo   = '/static/logo.png';    //准备好的logo图片
        $idPath = $this->getIdPath($uid);
        $QRFile = '/qrcode/'.$type.'/'.$idPath.'.png';  // 已经生成的原始二维码图
        $logoQR = '/qrcode/'.$type.'/'.$idPath.'_logo.png';  // 生成的二维码图片位置

        // 判断二维码是否存在
        if(empty($logo) && is_file($path.$QRFile)){
            return $domain.$QRFile;
        }
        if($logo && is_file($path.$logoQR)){
            return $domain.$logoQR;
        }

        //生成二维码图片
        $this->checkPath($path.$QRFile);
        $this->makeQR($text, $path.$QRFile, $size);
        if(empty($logo)){
            return $domain.$QRFile;
        }

        // 生成带logo的二维码
        $this->checkPath($path.$logoQR);
        if(is_file($path.$QRFile)){
            $this->makeLogoQR($path.$QRFile, $path.$logo, $path.$logoQR);
        }

        return $domain.$logoQR;
    }

    // 生成二维码
    protected function makeQR($text, $QRFile, $size)
    {
        $errorLevel = 'L';  //容错级别
        \PHPQRCode\QRcode::png($text, $QRFile, $errorLevel, $size, 2);
    }


    /**
     * 生成带logo的二维码（在二维码上面贴上logo）
     * @param $QRFile  已经生成好了的二维码图片文件
     * @param $logoFile logo图片
     * @return void
     */
    protected function makeLogoQR($QRFile, $logoFile, $toFile)
    {
        // 打开生成的二维码图片 与 logo图片
        $QR   = imagecreatefromstring(file_get_contents($QRFile));
        $logo = imagecreatefromstring(file_get_contents($logoFile));
        // 调整二维码内部的logo
        $QR_width       = imagesx($QR);  // 二维码图片宽度
        $QR_height      = imagesy($QR);  // 二维码图片高度
        $logo_width     = imagesx($logo);  // logo图片宽度
        $logo_qr_width  = $QR_width / 5;   // 二维码中logo的宽度
        $from_width     = ($QR_width - $logo_qr_width) / 2; // 二维码中logo的起始位置
        $logo_height    = imagesy($logo);      //logo图片高度
        $scale          = $logo_width / $logo_qr_width;  // logo的长宽比例
        $logo_qr_height = $logo_height / $scale;  // logo的应该的宽度

        //重新组合图片并调整大小
        imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height);
        //输出图片
        imagepng($QR, $toFile);
    }


    // 返回失败
    protected function return_false($error)
    {
        $this->error = $error;

        return false;
    }

    // 检查路径是否存在
    protected function checkPath($path)
    {
        $path = dirname($path);
        if(is_dir($path)){
            return true;
        }

        mkdir($path, 0755, true);

        return true;
    }

    // 根据ID生成路径
    protected function getIdPath($_id)
    {
        $path = '';
        $ds   = '';
        $_ids = str_split($_id, 2);
        foreach($_ids as $_it){
            if(is_numeric($_it)){
                $path .= $ds.$_it;
                $ds   = DIRECTORY_SEPARATOR;
                $ds   = '/';
            }
        }

        return $path;
    }
}

